
package com;

import com.br.util.FonteConexoes;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.faces.application.ConfigurableNavigationHandler;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;
import javax.annotation.Resource;
import javax.sql.DataSource;

@ManagedBean(name="usuario")
@SessionScoped
public class UsuarioBean {

    /**
     * No Hermes Web, o usuário usa um endereço de e-mail (em vez de um nome de usuário)
     * para se autenticar no sistema.
     */
    private String email;

    private String senha;

    private String nomeCompleto;

    /**
     * Indica se o usuário está ou não logado.
     */
    private boolean logado = false;

    /**
     * Mensagem indicando se o usuário está ou não logado.
     */
    private String statusLogado = "";

    // ACESSO AO BANCO DE DADOS. FUTURAMENTE, RETIRAR DESSA CLASSE.
//    @Resource(name="jdbc/hermesweb") private DataSource dataSource;

    public String getEmail()
    {
        return email;
    }

    public String getSenha()
    {
        return senha;
    }

    public String getStatusLogado()
    {
        return statusLogado;
    }

    public void setEmail(String email)
    {
        this.email = email;
    }

    public void setSenha(String senha)
    {
        this.senha = senha;
    }
    
    public String efetuarLogin()
    {
        String resultado;

        try
        {
            if (efetuarLoginBD() == true)
            {
                logado = true;
                statusLogado = "";
                resultado = "inicio";
            }
            else
            {
                statusLogado = "Tentativa de login falhou! E-mail ou senha incorretos.";
                resultado = "login";
            }
        } catch (SQLException sqle)
        {
            resultado = "erro";
        }

        return resultado;
    }

    public String efetuarLogoff()
    {
        logado = false;
        return "login";
    }

    /**
     * Verifica se o acesso que está sendo realizado é por um usuário logado.
     * Caso não for, o acesso é impedido e acontece redirecionamento para a página
     * de login.
     */
    public void verificarLogin(ComponentSystemEvent event)
    {
        if (logado == false)
        {
            statusLogado = "Você ainda não está autenticado!";

            FacesContext context = FacesContext.getCurrentInstance();
            ConfigurableNavigationHandler handler =
                    (ConfigurableNavigationHandler)context.getApplication().getNavigationHandler();
            handler.performNavigation("login?faces-redirect=true");
        }
    }

    /**
     * Usado para redirecionar um usuário para a página inicio.xhtml se ele já estiver autenticado
     * e estiver tentando acessar a página de login
     */
    public void redirecionarInicio(ComponentSystemEvent event)
    {
        if (logado == true)
        {
            statusLogado = "";

            FacesContext context = FacesContext.getCurrentInstance();
            ConfigurableNavigationHandler handler =
                    (ConfigurableNavigationHandler)context.getApplication().getNavigationHandler();
            handler.performNavigation("inicio?faces-redirect=true");
        }
    }

    // COMEÇO DO ACESSO AO BANCO DE DADOS. FUTURAMENTE, RETIRAR DESSA CLASSE.

    private boolean efetuarLoginBD() throws SQLException
    {
        Connection conexao = null;
        try {
            conexao = new FonteConexoes().getConnection();
        } catch (Exception e) {
            throw new SQLException(e.getMessage());
        }
        
        boolean resultado;

        try
        {
            PreparedStatement prepStmt = conexao.prepareStatement("SELECT senha_usua FROM usuarios"
                    + " WHERE email_usua = ? AND privilegio_usua = 'a'");
            prepStmt.setString(1, email);
            ResultSet rs = prepStmt.executeQuery();

            if (rs.next() == true)
            {
                // usuário existente; agora, vamos verificar a senha

                String senhaRecuperada = rs.getString("senha_usua");

                if (senha.equals(senhaRecuperada) == true)
                {
                    resultado = true;
                }
                else
                {
                    resultado = false;
                }
            }
            else
            {
                resultado = false;
            }

            return resultado;
        }
        finally
        {
            conexao.close();
        }
    }

    // FIM DO ACESSO AO BANCO DE DADOS.
}
